/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import it.dei.unipd.healthservice.resource.Fornisce;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Rappresenta il collegamento tra una materia prima e un suo possibile fornitore
 * 
 * @author Valentini
 * @version 1.00
 */
public class FornisceDatabase {

	/**
	 * Query di inserimento nuovo fornitore nel database
	 */
	private static final String INSERT_STATEMENT = "INSERT INTO fornisce("+
            			"piva, idmateriaprima, costo) "+
            			"VALUES (?, ?, ?);";

	/**
	 * Istruzione di aggiornamento per il database.
	 */
	private static final String UPDATE_STATEMENT = "UPDATE fornisce "+
			   			"SET costo=? "+
					    "WHERE piva=? AND idmateriaprima=?;";
 	
	/**
	 * Istruzione di cancellazione per il database.
	 */
	private static final String DELETE_STATEMENT = "DELETE FROM fornisce "+
						"WHERE piva=? AND idmateriaprima=?;";
	
	/**
	 * Istruzione di cancellazione per il database in base al solo fornitore
	 */
	private static final String DELETE_STATEMENT_FORNITORE = "DELETE FROM fornisce "+
						"WHERE piva=? ;";
	
	/**
	 * Istruzione di cancellazione per il database in base alla sola materia prima
	 */
	private static final String DELETE_STATEMENT_MATERIA_PRIMA = "DELETE FROM fornisce "+
						"WHERE idmateriaprima=?;";
		
	/**
	 * Connessione al database
	 */
	private final Connection con;

	private final Fornisce fornisce;
	/**
	 * Crea un nuovo elemento Fornisce nel database
	 * 
	 * @param con
	 *            connessione al database.
	 * @param produce
	 * 			  l'elemento da inserire
	 */			
	public FornisceDatabase(Connection con, Fornisce fornisce) {
		this.con = con;
		this.fornisce = fornisce;
	}

	/**
	 * Crea un nuovo elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void createFornisce() throws SQLException {

		PreparedStatement pstmt = null;
		String INSERT_STATEMENT_ = "INSERT INTO fornisce ("+
    			"piva, idmateriaprima, costo) "+
    			"VALUES (?, ?, "+fornisce.getCosto()+");";

		try {
			pstmt = con.prepareStatement(INSERT_STATEMENT_);
			pstmt.setString(1, fornisce.getPiva());
			pstmt.setInt(2, fornisce.getIdMateriaPrima());
			//pstmt.setString(3, fornisce.getCosto());
						
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}//end createfornisce 
	
	/**
	 * Aggiorna il costo di un elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void updateFornisce() throws SQLException {

		PreparedStatement pstmt = null;
		String UPDATE_STATEMENT_ = "UPDATE fornisce "+
	   			"SET costo= "+fornisce.getCosto()+" "+
			    "WHERE piva=? AND idmateriaprima=?;";

		try {
			pstmt = con.prepareStatement(UPDATE_STATEMENT_);
			pstmt.setString(1, fornisce.getPiva());
			pstmt.setInt(2, fornisce.getIdMateriaPrima());
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}//end updatefornisce
	
	/**
	 * Cancella un elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deleteFornisce() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT);
			pstmt.setString(1, fornisce.getPiva());
			pstmt.setInt(2, fornisce.getIdMateriaPrima());
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}//end deletefornisce
	
	/**
	 * Cancella tutti gli elementi nel database di un fornitore
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deleteFornisceByFornitore() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT_FORNITORE);
			pstmt.setString(1, fornisce.getPiva());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
	}//end deletefornisceByFornitore
	
	/**
	 * Cancella tutti gli elementi nel database di una materia prima
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deleteFornisceByMateriaPrima() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT_MATERIA_PRIMA);
			pstmt.setInt(1, fornisce.getIdMateriaPrima());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
	}//end deletefornisceByFornitore
}
